/**
 * 
 */
package br.com.datasun.biblioteca.facade;

import java.util.List;

import br.com.datasun.biblioteca.business.AssuntoBO;
import br.com.datasun.biblioteca.business.BibliotecaBO;
import br.com.datasun.biblioteca.business.CategoriaBO;
import br.com.datasun.biblioteca.business.EditoraBO;
import br.com.datasun.biblioteca.business.ExemplarBO;
import br.com.datasun.biblioteca.business.PessoaFisicaBO;
import br.com.datasun.biblioteca.business.LivroBO;
import br.com.datasun.biblioteca.entities.Assunto;
import br.com.datasun.biblioteca.entities.Biblioteca;
import br.com.datasun.biblioteca.entities.Categoria;
import br.com.datasun.biblioteca.entities.Editora;
import br.com.datasun.biblioteca.entities.Exemplar;
import br.com.datasun.biblioteca.entities.Livro;
import br.com.datasun.biblioteca.entities.PessoaFisica;
import br.com.datasun.biblioteca.exceptions.AssuntoJaExistenteException;
import br.com.datasun.biblioteca.exceptions.AssuntoSemNomeException;
import br.com.datasun.biblioteca.exceptions.BairroInvalidoException;
import br.com.datasun.biblioteca.exceptions.BibliotecaJaExistenteException;
import br.com.datasun.biblioteca.exceptions.BibliotecaSemNomeException;
import br.com.datasun.biblioteca.exceptions.BusinessException;
import br.com.datasun.biblioteca.exceptions.CEPInvalidoException;
import br.com.datasun.biblioteca.exceptions.CategoriaJaExistenteException;
import br.com.datasun.biblioteca.exceptions.CategoriaSemNomeException;
import br.com.datasun.biblioteca.exceptions.CidadeRequeridaException;
import br.com.datasun.biblioteca.exceptions.ExemplarBibliotecaNaoInformadaException;
import br.com.datasun.biblioteca.exceptions.ExemplarDataCompraNaoInformadaException;
import br.com.datasun.biblioteca.exceptions.ExemplarEstadoConservacaoNaoInformadoException;
import br.com.datasun.biblioteca.exceptions.ExemplarLivroNaoInformadoException;
import br.com.datasun.biblioteca.exceptions.ExemplarQuantidadeNaoInformadaException;
import br.com.datasun.biblioteca.exceptions.PessoaFisicaJaExistenteException;
import br.com.datasun.biblioteca.exceptions.PessoaFisicaSemNomeException;
import br.com.datasun.biblioteca.exceptions.EditoraJaExistenteException;
import br.com.datasun.biblioteca.exceptions.EditoraSemNomeException;
import br.com.datasun.biblioteca.exceptions.LogradouroInvalidoException;
import br.com.datasun.biblioteca.exceptions.NomeInvalidoException;
import br.com.datasun.biblioteca.exceptions.NumeroLogradouroInvalidoException;
import br.com.datasun.biblioteca.exceptions.DAOException;

/**
 * @author Junior
 *
 */
public class CadastrosFacade {
	private AssuntoBO assuntoBO = new AssuntoBO();
	private CategoriaBO categoriaBO = new CategoriaBO();
	private EditoraBO editoraBO = new EditoraBO();
	private BibliotecaBO bibliotecaBO = new BibliotecaBO();
	private PessoaFisicaBO pessoaFisicaBO = new PessoaFisicaBO();
	private LivroBO livroBO = new LivroBO();
	private ExemplarBO exemplarBO = new ExemplarBO();

	/**
	 * 
	 */
	public CadastrosFacade() {
		// TODO Auto-generated constructor stub
	}
	
	/**

	* Executa as valida��es necess�rias no assunto e caso esteja tudo ok insere no banco de dados. Segue os dados validados:

	* <ul>

	* <li>Se o nome foi fornecido</li>

	*  <li>Se j� existe assunto cadastrado com o nome fornecido</li>

	* </ul> * @param assunto * @return o assunto inserido
CategoriaBO
	* @throws BusinessException - em caso de erro nao conhecido

	* @throws NullPointerException - caso o assunto n�o seja fornecido

	* @throws NomeInvalidoException - caso o nome fornecido seja invalido

	* @throws AssuntoExistenteException - caso ja exista assunto cadastrado com o nome fornecido

	*/

	public Assunto cadastrarAssunto(Assunto assunto) throws BusinessException, NullPointerException, NomeInvalidoException, AssuntoJaExistenteException, AssuntoSemNomeException{
		Assunto resultado = null;
		resultado = assuntoBO.inserir(assunto);			
		return resultado;
	}


	/**

	* Executa as valida��es necess�rias no assunto e caso esteja tudo ok atualiza no banco de dados. Segue os dados validados:

	* <ul>

	* <li>Se o nome foi fornecido</li>

	*  <li>Se j� existe assunto cadastrado com o nome fornecido</li>

	* </ul>

	* @param assunto

	* @return o assunto inserido

	* @throws BusinessException - em caso de erro nao conhecido

	* @throws NullPointerException - caso o assunto n�o seja fornecido

	* @throws NomeInvalidoException - caso o nome fornecido seja invalido

	* @throws AssuntoExistenteException - caso ja exista assunto cadastrado com o nome fornecido

	*/

	public Assunto atualizarAssunto(Assunto assunto) throws BusinessException, NullPointerException, NomeInvalidoException, AssuntoJaExistenteException, AssuntoSemNomeException{
		Assunto resultado = null;
		resultado = assuntoBO.atualizar(assunto);
		return resultado;		
	}

	 

	/**

	* Exclui o assunto do banco de dados

	* @param assunto

	* @throws BusinessException

	*/

	public void excluirAssunto(Assunto assunto) throws BusinessException{
		assuntoBO.excluir(assunto);					
	}
	
	
	//Editoras
	
	/**

	* Executa as valida��es necess�rias na editora e caso esteja tudo ok insere no banco de dados. Segue os dados validados:

	* <ul>

	* <li>Se o nome foi fornecido</li>

	*  <li>Se j� existe editora cadastrada com o nome fornecido</li>

	* </ul> * @param editora * @return a editora inserida

	* @throws BusinessException - em caso de erro nao conhecido

	* @throws NullPointerException - caso a editora n�o seja fornecida

	* @throws NomeInvalidoException - caso o nome fornecido seja invalido

	* @throws EditoraJaExistenteException - caso ja exista editora cadastrada com o nome fornecido

	*/

	public Editora cadastrarEditora(Editora editora) throws BusinessException, NullPointerException, NomeInvalidoException, EditoraJaExistenteException, EditoraSemNomeException{
		Editora resultado = null;
		resultado = editoraBO.inserir(editora);			
		return resultado;
	}


	/**

	* Executa as valida��es necess�rias na editora e caso esteja tudo ok atualiza no banco de dados. Segue os dados validados:

	* <ul>

	* <li>Se o nome foi fornecido</li>

	*  <li>Se j� existe editora cadastrada com o nome fornecido</li>

	* </ul>

	* @param editora

	* @return a editora atualizada

	* @throws BusinessException - em caso de erro nao conhecido

	* @throws NullPointerException - caso a editora n�o seja fornecida

	* @throws NomeInvalidoException - caso o nome fornecido seja invalido

	* @throws EditoraJaExistenteException - caso ja exista editora cadastrada com o nome fornecido

	*/

	public Editora atualizarEditora(Editora editora) throws BusinessException, NullPointerException, NomeInvalidoException, EditoraJaExistenteException, EditoraSemNomeException{
		Editora resultado = null;
		resultado = editoraBO.atualizar(editora);
		return resultado;		
	}

	 

	/**

	* Exclui a editora do banco de dados

	* @param editora

	* @throws BusinessException

	*/

	public void excluirEditora(Editora editora) throws BusinessException{
		editoraBO.excluir(editora);					
	}
	
	//Fim Editoras
	
	
	public Biblioteca cadastrarBiblioteca(Biblioteca biblioteca)throws BibliotecaSemNomeException, BibliotecaJaExistenteException, LogradouroInvalidoException, NumeroLogradouroInvalidoException, CEPInvalidoException, BairroInvalidoException,CidadeRequeridaException ,BusinessException, NullPointerException{
		Biblioteca resultado = null;
		resultado = bibliotecaBO.inserir(biblioteca);
		return resultado;
	}
	
	public Biblioteca atualizarBiblioteca (Biblioteca biblioteca)throws BibliotecaSemNomeException, BibliotecaJaExistenteException, LogradouroInvalidoException, NumeroLogradouroInvalidoException, CEPInvalidoException, BairroInvalidoException, CidadeRequeridaException ,BusinessException, NullPointerException{
		Biblioteca resultado = null;
		resultado = bibliotecaBO.atualizar(biblioteca);
		return resultado;
	}
	
	public void excluirBiblioteca (Biblioteca biblioteca) throws BusinessException{
		bibliotecaBO.excluir(biblioteca);
	}
	
	public Livro cadastrarLivro(Livro livro)throws NullPointerException ,BusinessException {
		Livro resultado = null;
		resultado       =  livroBO.inserir(livro);
		return resultado;
	}
	
	public Livro atualizarLivro (Livro livro)throws BusinessException, NullPointerException{
		Livro resultado = null;
		resultado =  livroBO.atualizar(livro);
		return resultado;
	}
	
	public void excluirLivro (Livro livro) throws BusinessException{
		livroBO.excluir(livro);
	}
	
	public PessoaFisica cadastrarCliente(PessoaFisica pessoaFisica) throws PessoaFisicaSemNomeException, PessoaFisicaJaExistenteException, LogradouroInvalidoException, NumeroLogradouroInvalidoException, CEPInvalidoException, BairroInvalidoException, CidadeRequeridaException, BusinessException, NullPointerException{
		PessoaFisica resultado = null;
		resultado = pessoaFisicaBO.inserir(pessoaFisica);
		return resultado;
	}

	public PessoaFisica atualizarCliente(PessoaFisica pessoaFisica) throws PessoaFisicaSemNomeException, PessoaFisicaJaExistenteException, LogradouroInvalidoException, NumeroLogradouroInvalidoException, CEPInvalidoException, BairroInvalidoException, CidadeRequeridaException, BusinessException, NullPointerException, DAOException{
		PessoaFisica resultado = null;
		resultado = pessoaFisicaBO.atualizar(pessoaFisica);
		return resultado;
	}
	
	public void excluirCliente (PessoaFisica pessoaFisica) throws BusinessException{
		pessoaFisicaBO.excluir(pessoaFisica);
	}
	
	public Categoria cadastrarCategoria (Categoria categoria) throws CategoriaSemNomeException, CategoriaJaExistenteException, BusinessException, NullPointerException {
		Categoria resultado = null;
		resultado = categoriaBO.inserir(categoria);
		return resultado;
	}

	public Categoria atualizarCategoria (Categoria categoria) throws CategoriaSemNomeException, CategoriaJaExistenteException, BusinessException, NullPointerException {
		Categoria resultado = null;
		resultado = categoriaBO.atualizar(categoria);
		return resultado;
	}
	
	public void excluirCategoria(Categoria categoria) throws BusinessException {
		categoriaBO.excluir(categoria);
	}
	
	public List<Exemplar> cadastrarExemplares (Exemplar exemplar,int Quantidade  ) throws BusinessException, NullPointerException, ExemplarBibliotecaNaoInformadaException, ExemplarLivroNaoInformadoException, ExemplarDataCompraNaoInformadaException, ExemplarEstadoConservacaoNaoInformadoException, ExemplarQuantidadeNaoInformadaException  {
		return exemplarBO.inserirExemplares(exemplar, Quantidade);
	}
	
	public boolean atualizarExemplar(Exemplar exemplar) throws BusinessException, NullPointerException, ExemplarBibliotecaNaoInformadaException, ExemplarLivroNaoInformadoException, ExemplarDataCompraNaoInformadaException, ExemplarEstadoConservacaoNaoInformadoException  {
		return exemplarBO.atualizarExemplar(exemplar);
	}
	
	public boolean excluir(Exemplar exemplar) throws BusinessException{
		return exemplarBO.excluir(exemplar);
	}
	
}
